package controllers;

import java.sql.Timestamp;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import repository.EventRepository;
import repository.FriendRequestRepository;
import repository.UserRepository;
import domain.User;

@Controller
public class GeneralController {
	private UserRepository userRepository;
	private FriendRequestRepository friendRequestRepository;
	private MessageSource msgSrc; 

	@Autowired
	public GeneralController(UserRepository userRepository,
							FriendRequestRepository friendRequestRepository,
							EventRepository eventRepository,
							MessageSource msgSrc) {
		this.userRepository = userRepository;
		this.friendRequestRepository = friendRequestRepository;
		this.msgSrc = msgSrc; 
	}

	@RequestMapping(method = RequestMethod.GET)
	public String index(HttpSession sess, ModelMap mav) {
		User user = (User) sess.getAttribute("user");
		String errorLoginMsg = "";
		
		if (user != null) {
			int friendRequests = (Integer) sess.getAttribute("friendRequests");
			int pendingRequests = (Integer) sess.getAttribute("pendingRequests");
			mav.addAttribute("user", user);
			mav.addAttribute("friendRequests", friendRequests);
			mav.addAttribute("pendingRequests", pendingRequests);
			mav.addAttribute("eventNotifications", user.getEventNotifications());
			mav.addAttribute("workPostNotifications", user.getWorkPostNotifications());
			
			// TODO: modularizar un poco
			if (user.isAdmin()) {
				if (user.getSocialToken() == null) {
					
					errorLoginMsg += "Para poder sincronizar los egresados con su perfil de LinkedIn debe dar permisos a la aplicaci&oacute;n haciendo click <a href='../data/signInLinkedIn'>aqu&iacute;</a>";
					errorLoginMsg += "<br/>Para poder sincronizar los egresados con su perfil de Facebook debe dar permisos a la aplicaci&oacute;n haciendo click <a href='../data/signInFacebook'>aqu&iacute;</a>";
					mav.addAttribute("errorLogin", errorLoginMsg);
				} else {
					if (user.getSocialToken().getLinkedInToken() == null) {
						errorLoginMsg += "Para poder sincronizar los egresados con su perfil de LinkedIn debe dar permisos a la aplicaci&oacute;n haciendo click <a href='../data/signInLinkedIn'>aqu&iacute;</a>"; 
					}
					
					if (user.getSocialToken().getFacebooktoken() == null) {
						errorLoginMsg += "<br/>Para poder sincronizar los egresados con su perfil de Facebook debe dar permisos a la aplicaci&oacute;n haciendo click <a href='../data/signInFacebook'>aqu&iacute;</a>";
					}
					
					mav.addAttribute("errorLogin", errorLoginMsg);
				}
				return "general/indexadmin";
			} else {
				if (user.getSocialToken() == null) {
					errorLoginMsg += "Todav&iacute;a no has importado tu perfil de LinkedIn. Para hacerlo hace click <a href='../data/signInLinkedIn'>aqu&iacute;</a>";
					errorLoginMsg += "<br/>Todav&iacute;a no has importado tu perfil de Facebook. Para hacerlo hace click <a href='../data/signInFacebook'>aqu&iacute;</a>";
				} else {
					if (user.getSocialToken().getLinkedInToken() == null) {
						errorLoginMsg += "Todav&iacute;a no has importado tu perfil de LinkedIn. Para hacerlo hace click <a href='../data/signInLinkedIn'>aqu&iacute;</a>";
					}
					
					if (user.getSocialToken().getFacebooktoken() == null) {
						errorLoginMsg += "Todav&iacute;a no has importado tu perfil de Facebook. Para hacerlo hace click <a href='../data/signInFacebook'>aqu&iacute;</a>";
					}
				}
				mav.addAttribute("errorLogin", errorLoginMsg);
				return "general/indexuser";
			}
		}
		return "general/index";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String login(HttpServletRequest req, HttpSession sess,
			@RequestParam("user") String userParam,
			@RequestParam("password") String pass, ModelMap mav) {

		User user = userRepository.validate(userParam, pass);

		if (user != null) {
			if (!user.isConfirmed()) {
				mav.addAttribute("errorLogin", msgSrc.getMessage("solicitudDeCuenta", null,null));
			} else if (!user.isActive()) {
				mav.addAttribute("errorLogin", msgSrc.getMessage("cuentaDesactivada", null,null));
			} else {
				sess.setAttribute("user", user);
				sess.setAttribute("friendRequests", friendRequestRepository.getFriendRequestsForUser(user).size());
				sess.setAttribute("pendingRequests", userRepository.getPendingUserRequests().size());
				user.setLastAccess(new Timestamp(Calendar.getInstance().getTime().getTime()));
			}
		} else {
			mav.addAttribute("errorLogin", msgSrc.getMessage("errorLoginDatoInvalido", null,null));
		}

		return this.index(sess, mav);
	}

	@RequestMapping(method = RequestMethod.GET)
	public ModelAndView logout(HttpSession sess, ModelAndView mav) {
		String title = (String) sess.getAttribute("title");
		sess.invalidate();
		mav.addObject("title", title);
		mav.setViewName("general/index");
		return mav;
	}

	@RequestMapping(method = RequestMethod.GET)
	public ModelAndView error() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("errorTitle", msgSrc.getMessage("errorSistemaTitle", null,null));
		mav.addObject("errorMessage", msgSrc.getMessage("errorSistemaMessage", null,null));
		mav.setViewName("general/error");
		return mav;
	}
}